public class Code2 {
    // 买卖股票的最佳时机含手续费

    public int maxProfit(int[] prices, int fee) {
        // 1. 创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回值

        // 这里的 i 表示的是第 i 天结束后所能获得到的最大利润

        // 分析题目我们可知，当前存在两种情况分别为 买入、卖出
        // 此时我们就需要创建出表述当前状态的状态表 f[i] 表示的是 买入 此时的最大利润。g[i] 表示的是 卖出 此时的最大利润

        int n = prices.length;
        int[] f = new int[n];
        int[] g = new int[n];

        // 此时我们进行初始化操作, 此时只需要初始化买入的表即可
        f[0] = -prices[0];
        for(int i = 1; i < n; i++){
            // 针对 买入 f ，可能存在的情况有下面两种：在前一天买入后当天不进行操作，在前一天 卖出 后所能的到的最大利润
            f[i] = Math.max(f[i - 1], g[i - 1] - prices[i]);
            // 针对 卖出 g ，也可能存在下面的两种情况：在前一天卖出后今天不进行操作，在前一天执行 买入 操作后，当天能得到的最大利润
            // 注意要减去手续费，在这里选择了 卖出 时进行操作
            g[i] = Math.max(g[i - 1], f[i - 1] + prices[i] - fee);
        }
        // 此时确定返回值
        // 这里的利润值一定是卖出后的情况下大，买入一定是小于的
        return g[n - 1];
    }
}
